-- HealerThemeBridge.lua — palette de soins/absorbs + glue sans modifier Healer.lua
local ADDON, DFFT = ...
if not DFFT or not DFFT.DB then return end
local DB = DFFT.DB

-- ================= utils =================
local function hex(h)
  h = (h or ""):gsub("#","")
  local r = tonumber(h:sub(1,2),16) or 255
  local g = tonumber(h:sub(3,4),16) or 255
  local b = tonumber(h:sub(5,6),16) or 255
  return {r/255, g/255, b/255}
end
local function copyRGB(c) if not c then return {1,1,1} end return {c[1] or 1, c[2] or 1, c[3] or 1} end

-- =============== Fallback thème soins si Themes.lua absent ===============
local FALLBACK_THEME = {
  target    = { small=hex("#ddffaa"), medium=hex("#c1ff63"), big=hex("#adff2f"), vbig=hex("#95d009") },
  nontarget = { small=hex("#a2f6da"), medium=hex("#6eecc2"), big=hex("#33e1b9"), vbig=hex("#00d0ad") },
  absorb    = hex("#FFE4B5"),
}

-- =============== API publique palettes soins ===============
-- Retourne la table du thème courant (depuis DB.healTheme) ou fallback.
function DFFT.GetHealTheme()
  local name = DB.healTheme or "Mint"
  local all  = DFFT.HealThemes
  local T    = (type(all)=="table" and all[name]) or FALLBACK_THEME
  return T
end

-- Récupère une couleur par "tier" et côté (cible / non-cible).
-- tier ∈ {"small","medium","big","vbig"} ; isTarget = bool
function DFFT.HealColorFor(tier, isTarget)
  local T = DFFT.GetHealTheme()
  local bucket = isTarget and (T and T.target) or (T and T.nontarget)
  if bucket and bucket[tier] then
    local c = bucket[tier]
    return c[1] or 1, c[2] or 1, c[3] or 1
  end
  return 0.7, 1.0, 0.7
end

-- Couleur unique des absorbs (parenthèses).
function DFFT.AbsorbColor()
  local T = DFFT.GetHealTheme()
  local c = (T and T.absorb) or FALLBACK_THEME.absorb
  return c[1] or 1, c[2] or 0.9, c[3] or 0.7
end

-- =============== Sélecteur de thème (si Themes.lua n’est pas chargé) ===============
-- Options Colors appelle déjà DFFT.ApplyHealTheme si présent ; on garde la compat.
if not DFFT.ApplyHealTheme then
  function DFFT.ApplyHealTheme(name)
    DB.healTheme = name or "Mint"
    if print then print(("|cff88ff88SCT|r Healer theme selected: %s"):format(DB.healTheme)) end
  end
end

-- =============== Intégration Absorbs (case à cocher côté Options) ===============
DFFT.Healer = DFFT.Healer or {}

-- Si ton Healer.lua expose déjà SetAbsorbsEnabled, on ne touche à rien.
if type(DFFT.Healer.SetAbsorbsEnabled) ~= "function" then
  function DFFT.Healer.SetAbsorbsEnabled(on)
    on = not not on
    DB.healer                 = DB.healer or {}
    DB.healer.absorbs         = DB.healer.absorbs or {}
    DB.healer.absorbs.show    = on
    DB.healer.absorbsEnabled  = on
    -- miroirs legacy pour anciens chemins de code
    DB.healer.showAbsorbs     = on
    DB.showAbsorbs            = on
    if print then
      print( on and "|cff88ff88SCT|r Absorbs: ON" or "|cffff8888SCT|r Absorbs: OFF")
    end
  end
end

-- =============== Aides pratiques pour Healer.lua (à utiliser si souhaité) ===============
-- Ces wrappers ne sont pas invasifs : Healer.lua peut les ignorer si déjà gère ses couleurs.

-- Appelle fn() avec la palette de soins/absorbs forcée dans DB.*Color/DB.nonTargetColor,
-- ce qui permet de réutiliser exactement la même routine d’affichage que les dégâts.
--   tier ∈ {"small","medium","big","vbig"}
--   isTarget = bool
function DFFT.WithHealPalette(tier, isTarget, fn)
  local rSmall, gSmall, bSmall = DFFT.HealColorFor("small",  true)
  local rMed,   gMed,   bMed   = DFFT.HealColorFor("medium", true)
  local rBig,   gBig,   bBig   = DFFT.HealColorFor("big",    true)
  local rV,     gV,     bV     = DFFT.HealColorFor("vbig",   true)

  local ntR, ntG, ntB = DFFT.HealColorFor(tier or "small", false)

  -- sauvegarde
  local b_small, b_med, b_big, b_vbig = DB.smallColor, DB.mediumColor, DB.bigColor, DB.veryBigColor
  local b_nonTarget = DB.nonTargetColor

  -- override temporaire
  DB.smallColor     = {rSmall, gSmall, bSmall}
  DB.mediumColor    = {rMed,   gMed,   bMed}
  DB.bigColor       = {rBig,   gBig,   bBig}
  DB.veryBigColor   = {rV,     gV,     bV}
  DB.nonTargetColor = {ntR, ntG, ntB}

  local ok, err = pcall(fn)

  -- restore
  DB.smallColor, DB.mediumColor, DB.bigColor, DB.veryBigColor = b_small, b_med, b_big, b_vbig
  DB.nonTargetColor = b_nonTarget

  if not ok and print then print("|cffff5555SCT|r WithHealPalette error:", err) end
end

-- Idem mais pour les absorbs (couleur unique).
function DFFT.WithAbsorbPalette(fn)
  local aR, aG, aB = DFFT.AbsorbColor()
  local saveSmall, saveMed, saveBig, saveV = DB.smallColor, DB.mediumColor, DB.bigColor, DB.veryBigColor
  local saveNT = DB.nonTargetColor

  DB.smallColor, DB.mediumColor, DB.bigColor, DB.veryBigColor = {aR,aG,aB}, {aR,aG,aB}, {aR,aG,aB}, {aR,aG,aB}
  DB.nonTargetColor = {aR,aG,aB}

  local ok, err = pcall(fn)

  DB.smallColor, DB.mediumColor, DB.bigColor, DB.veryBigColor = saveSmall, saveMed, saveBig, saveV
  DB.nonTargetColor = saveNT

  if not ok and print then print("|cffff5555SCT|r WithAbsorbPalette error:", err) end
end
